#ifndef SCENE_H
#define SCENE_H

#include <vector>
#include "structures.h"
#include "Objet.h"
#include "Image.h"
#include "Observateur.h"
#include <float.h>
#include "Lumiere.h"
#include <string> 

class Illumination;
class Grille3D;

class Scene{
public:
	Scene(Observateur &obs, Image &i, Couleur const &c, int nb, int profondeurMax, Illumination *illumination, float epsilon);
	~Scene();
	void rayTracer();
	void rayTracerAAR(float nbSubdivisionsX, float nbSubdivisionsY);
	void rayTracerAAA();
	void ajoutObjet(Objet &o);
	void ajoutObjet(Objet *o);
	void sauvegarde();
	Observateur observateur;
	std::vector<Objet*> objets;
	Image img;
	Couleur couleurFond;
	
    inline float getCoeffAmbiant() { return coeffAmbiant; };
    inline Couleur getAmbiant() { return CouleurAmbiante; };
	std::vector<Lumiere*> getSources();
	//std::vector<Objet*> getObjets();
	void ajouterSource(Lumiere* l);
	void setCoeffAmbiant(float c);
	void setCouleurAmbiante(Couleur c);
	Couleur reflexionSpeculaire(Rayon &r, Intersection &i, int &nombre);
	Couleur transparenceRefractive(Rayon &r, Intersection &i, int &nombre);
	bool lireFichier(std::string name);
	Couleur calculerCouleur(float x, float y);
	Couleur couleurAntialiasing(float x, float y, float unite, int profondeur);
	bool allerEnProfondeur(Couleur c1, Couleur c2);
	int obtenirIndiceTableauCouleur(float x, float y);
	Couleur recupererCouleurTableauCouleur(float x, float y);
	Intersection chercherIntersection(Rayon &r);
	bool chercherIntersectionCasOmbres(Rayon &r, float distance);

	Grille3D* getGrille3D();

private :
	Couleur CouleurAmbiante;
	float coeffAmbiant;
	std::vector<Lumiere*> sources;
	int nombre;
	Couleur** tableauCouleurs;
	int profondeurMax;
	float epsilon;
	Illumination *illumination;
	int tailleTableauCouleur;
	int nombreElementColonneTableauCouleur;
	float espacementPointsTableauCouleur;

	Grille3D *grille;
};

#endif